<?php

//Diese Funktion dient dazu nicht benigten Code aus JPEG Bildern zu filtern
function jpg_clean($filename, $destination, $erstellen = TRUE)
{
	
	//Zuerst handle erstellen um $filename bin舐 auszulesen
	$handle = fopen($filename, "rb");
	
	//Anschlieﾟend immer die Segmente mit der gre auslesen
	$segment[] = fread($handle, 2);
	
	//Wenn die ersten beiden Bytes nicht 0xFF 0xD8 entsprechen - abbruch!
	//SOIマーカ FFD8 が有るかチェック
	if($segment[0] === "\xFF\xD8")
	{

    	//Jetzt schauen ob neues Segment 0xFF entspricht - wenn nicht abbruch
		$segment[] = fread($handle, 1);

    	//Wenn Segment vorhanden - fahre fort!
    	if($segment[1] === "\xFF")
    	{
		
			//Dateizeiger an den Anfang setzen
			rewind ($handle);
			
			//Nun wird die ganze Datei durchsucht
			while(!feof($handle))
			{
	        	$daten = fread($handle, 1);
				if($daten === "\xFF"){
					$daten .= fread($handle, 1);
					if( (preg_match("/FFC[0-4]{1,1}/i",bin2hex($daten))) 
					 || (preg_match("/FFE[1-9a-zA-Z]{1,1}/i",bin2hex($daten)))
					 || ($daten === "\xFF\xFE") )
					{
						
						//SOF				FFC0-3
						//DHT				FFC4
						//exif				FFEx
						//コメント			FFFE
						//Position des Dateizeigers
						$position = ftell($handle);
						
						//Gre des Segments auslesen
						//FFFEの直後の値が、コメント文字列の長さ + 2バイト[CRLF]
						$size = fread($handle, 2);
						
						//Gre ausrechnen
						//例) 0006 = 256*0 + 4 + 2[CRLF]
						$newsize = 256 * ord($size{0}) + ord($size{1});
						
						//Hier nun neue Position bestimmen -> Position hinter dieser Zone
						//-2はマーカー分？
						$newpos = $position + $newsize;
						
						//Dateiziger setzen
						//コメント部分を読み飛ばし
						fseek($handle, $newpos);
					}
					else{
						//該当しなかったので読み込み位置を戻す
						$daten = null;
						$pos = ftell($handle)-2;
						fseek($handle,$pos);
						$newfile[] = fread($handle, 1);
					}
				}
				else
				{
					$newfile[] = $daten;
				}
			}
			//Hier File Handle schlieﾟen
			fclose($handle);

			//Wenn Schleife durch ist haben wir newfile als Array
			//Dieses wird nun in einen String umgewandelt
			$newfile = implode('',$newfile);
			if($erstellen === TRUE)
			{
				//Und schreiben dies nun in Angegebenen destination
				$handle = fopen($destination, "wb");
				fwrite($handle, $newfile);
				fclose($handle);
				return TRUE;
			}
			else
			{
				//Falls keine Erstellung gew・scht
				//gebe string zur・k
				return $newfile;
			}
		}
    	else
    	{
    		return FALSE;
    	}
  	}
  	else
  	{
  		return FALSE;
  	}
}

//jpegファイルを開いてフレーム・タイプとハフマンテーブルの値を取り出す
function getSOFDHT($filename,$soffile,$dhtfile)
{
	$handle = fopen($filename, "rb");
	$segment[] = fread($handle, 2);
	
  	//SOIマーカ FFD8 が有るかチェック
	if($segment[0] === "\xFF\xD8")
	{
		$segment[] = fread($handle, 1);
		//Wenn Segment vorhanden - fahre fort!
		if($segment[1] === "\xFF")
		{
			rewind ($handle);
			while(!feof($handle))
			{
	        	$daten = fread($handle, 1);
				if($daten === "\xFF"){
					$daten .= fread($handle, 1);
					if(preg_match("/FFC[0-3]{1,1}/i",bin2hex($daten)))
					{
						//フレーム・タイプ	marker=FFC0～FFC3
						//FFCxの直後の値が、データの大きさ
						$size = fread($handle, 2);
						
						//例) 0006 = 256*0 + 6
						$newsize = 256 * ord($size{0}) + ord($size{1});
						
						//FFC4からサイズ分だけ取得
						$sof[0]= $daten[0];
						$sof[1]= $daten[1];
						$sof[2]= $size[0];
						$sof[3]= $size[1];
						$sof[]=fread($handle, ($newsize-2));
					}
					else if($daten === "\xFF\xC4")
					{
						//ハフマンテーブル	marker=FFC4
						
						//FFC4の直後の値が、テーブルの大きさ
						$size = fread($handle, 2);
						
						//例) 0006 = 256*0 + 6
						$newsize = 256 * ord($size{0}) + ord($size{1});
						
						//FFC4からサイズ分だけ取得
						$dht[0]="\xFF";
						$dht[1]="\xC4";
						$dht[2]= $size[0];
						$dht[3]= $size[1];
						$dht[]=fread($handle, ($newsize-2));
					}
					else{
						//該当しなかったので読み込み位置を戻す
						$pos = ftell($handle)-1;
						fseek($handle,$pos);
					}
				}
			}
			fclose($handle);

			$sof = implode('',$sof);
			$dht = implode('',$dht);
			
			//ファイル出力
			$handle = fopen($soffile, "wb");
			fwrite($handle, $sof);
			fclose($handle);
			
			$handle = fopen($dhtfile, "wb");
			fwrite($handle, $dht);
			fclose($handle);

			return TRUE;
    	}
    	else
    	{
    		return FALSE;
    	}
	}
	else
	{
		return FALSE;
	}
}

?>